+2005-08-15 Øyvind Kolås <pippin@gimp.org>
+
+ * configure.ac: add rule to generate babl/base/Makefile
+ * babl/base: new directory
+ * babl/base/Makefile.am
+ * babl/base/babl-base.[ch]
+ * babl/base/type-double.c
+ * babl/base/type-float.c
+ * babl/base/type-u8.c
+ * babl/base/type-u16.c
+ * babl/base/model-rgb.c
+ * babl/base/model-grayscale.c
+ * babl/base/.cvsignore: added code removed in previous commit, in
+ a more oragnised manner.
+
+
+2005-08-15 Øyvind Kolås <pippin@gimp.org>
+
+ * babl/babl-base/babl-base.[ch]
+ * babl/babl-base/babl-base-components.c
+ * babl/babl-base/babl-base-conversions.c
+ * babl/babl-base/babl-base-conversions-model.c
+ * babl/babl-base/babl-base-conversions-type.c
+ * babl/babl-base/babl-base-models.c
+ * babl/babl-base/babl-base-pixel-formats.c
+ * babl/babl-base/babl-base-types.c
+ * babl/babl-base/Makefile.am
+ * babl/babl-base/: removed
+
2005-08-15 Øyvind Kolås <pippin@gimp.org>
* babl/babl-classes.h: BablPixelFormat: changed order of attributes to
--- /dev/null
+Makefile
+Makefile.in
+.deps
+*.lo
+*.la
+.libs
--- /dev/null
+h_sources = \
+ babl-base.h
+
+c_sources = \
+ babl-base.c \
+ type-double.c \
+ type-float.c \
+ type-u8.c \
+ type-u16.c \
+ model-rgb.c \
+ model-grayscale.c
+
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/babl
+
+noinst_LTLIBRARIES= libbase.la
+libbase_la_SOURCES= $(h_sources) $(c_sources)
+
+EXTRA_DIST := \
+ .cvsignore \
+ rgb-constants.h \
+ util.h
+
+
+LDADD = -lm
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+extern int babl_hmpf_on_name_lookups;
+
+static void types (void);
+static void models (void);
+
+void
+babl_base_init (void)
+{
+ babl_hmpf_on_name_lookups ++;
+
+ types ();
+ models ();
+
+ babl_hmpf_on_name_lookups --;
+}
+
+void
+babl_base_destroy (void)
+{
+ /* done by the destruction of the elemental babl clases */
+}
+
+/*
+ * types
+ */
+
+void babl_base_type_double (void);
+void babl_base_type_float (void);
+void babl_base_type_u8 (void);
+void babl_base_type_u16 (void);
+
+static void
+types (void)
+{
+ babl_base_type_double (); /* must be registered first since it is the
+ reference */
+ babl_base_type_float ();
+ babl_base_type_u8 ();
+ babl_base_type_u16 ();
+}
+
+/*
+ * models
+ */
+
+void babl_base_model_rgb (void);
+void babl_base_model_grayscale (void);
+
+static void
+models (void)
+{
+ babl_base_model_rgb (); /* must be registered first since it is the
+ reference */
+ babl_base_model_grayscale ();
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_BASE_H
+#define _BABL_BASE_H
+
+void babl_base_init ();
+void babl_base_destroy ();
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include "babl.h"
+#include <stdio.h>
+
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+#include "util.h"
+#include "rgb-constants.h"
+#include "math.h"
+
+static void components (void);
+static void models (void);
+static void conversions (void);
+
+void babl_base_model_grayscale (void)
+{
+ components ();
+ models ();
+ conversions ();
+}
+
+static void
+components (void)
+{
+ babl_component_new (
+ "luminance",
+ "id", BABL_LUMINANCE,
+ "luma",
+ NULL);
+}
+
+static void
+models (void)
+{
+ babl_model_new (
+ "grayscale",
+ "id", BABL_GRAYSCALE,
+ babl_component_id (BABL_LUMINANCE),
+ NULL);
+
+ babl_model_new (
+ "grayscale-gamma2.2",
+ "id", BABL_GRAYSCALE_GAMMA_2_2,
+ babl_component_id (BABL_LUMINANCE),
+ NULL);
+
+ babl_model_new (
+ "grayscale-alpha",
+ "id", BABL_GRAYSCALE_ALPHA,
+ babl_component_id (BABL_LUMINANCE),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+ babl_model_new (
+ "grayscale-alpha-premultiplied",
+ "id", BABL_GRAYSCALE_ALPHA_PREMULTIPLIED,
+ babl_component_id (BABL_LUMINANCE_MUL_ALPHA),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+}
+
+
+static void
+rgb_to_grayscale (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double red, green, blue;
+ double luminance, alpha;
+
+ red = *(double *)src[0];
+ green = *(double *)src[1];
+ blue = *(double *)src[2];
+ if (src_bands>3)
+ alpha = *(double *)src[3];
+ else
+ alpha = 1.0;
+
+ luminance = red * RGB_LUMINANCE_RED +
+ green * RGB_LUMINANCE_GREEN +
+ blue * RGB_LUMINANCE_BLUE;
+ *(double*)dst[0] = luminance;
+
+ if (dst_bands==2)
+ *(double*)dst[1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+static void
+rgb_to_grayscale_2_2 (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double red, green, blue;
+ double luminance, alpha;
+
+ red = *(double *) src[0];
+ green = *(double *) src[1];
+ blue = *(double *) src[2];
+ if (src_bands>3)
+ alpha = *(double *)src[3];
+ else
+ alpha = 1.0;
+
+ luminance = red * RGB_LUMINANCE_RED +
+ green * RGB_LUMINANCE_GREEN +
+ blue * RGB_LUMINANCE_BLUE;
+ *(double*)dst[0] = pow (luminance, 2.2);
+
+ if (dst_bands==2)
+ *(double*)dst[1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+static void
+grayscale_2_2_to_rgb (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double luminance;
+ double red, green, blue;
+ double alpha;
+
+ luminance = pow (*(double *)src[0], (1.0F/2.2F));
+ red = luminance;
+ green = luminance;
+ blue = luminance;
+ if (src_bands > 1)
+ alpha = *(double *)src[1];
+ else
+ alpha = 1.0;
+
+ *(double*)dst[0] = red;
+ *(double*)dst[1] = green;
+ *(double*)dst[2] = blue;
+
+ if (dst_bands>3)
+ *(double*)dst[3] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+
+static void
+grayscale_to_rgb (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double luminance;
+ double red, green, blue;
+ double alpha;
+
+ luminance = *(double *)src[0];
+ red = luminance;
+ green = luminance;
+ blue = luminance;
+ if (src_bands > 1)
+ alpha = *(double *)src[1];
+ else
+ alpha = 1.0;
+
+ *(double*)dst[0] = red;
+ *(double*)dst[1] = green;
+ *(double*)dst[2] = blue;
+
+ if (dst_bands>3)
+ *(double*)dst[3] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+grayscale_alpha_premultiplied_to_rgba (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ assert (src_bands == 2);
+ assert (dst_bands == 4);
+
+ while (n--)
+ {
+ double luminance = *(double *)src[0];
+ double alpha = *(double *)src[1];
+
+ if (alpha > 0.001)
+ {
+ luminance = luminance / alpha;
+ }
+ else
+ {
+ luminance = 0.0;
+ }
+
+ *(double*)dst[0] = luminance;
+ *(double*)dst[1] = luminance;
+ *(double*)dst[2] = luminance;
+ *(double*)dst[3] = alpha;
+ BABL_PLANAR_STEP
+ }
+}
+
+
+static void
+rgba_to_grayscale_alpha_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY;
+ assert (src_bands == 4);
+ assert (dst_bands == 2);
+
+ while (n--)
+ {
+ double red = *(double *)src[0];
+ double green = *(double *)src[1];
+ double blue = *(double *)src[2];
+ double alpha = *(double *)src[3];
+ double luminance;
+
+ luminance = red * RGB_LUMINANCE_RED +
+ green * RGB_LUMINANCE_GREEN +
+ blue * RGB_LUMINANCE_BLUE;
+
+ luminance *= alpha;
+
+ *(double*)dst[0] = luminance;
+ *(double*)dst[2] = alpha;
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+non_premultiplied_to_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ double alpha;
+ int band;
+
+ alpha = *(double *)src[src_bands-1];
+ for (band=0; band<src_bands-1;band++)
+ {
+ *(double*)dst[band] = *(double*) src[band] * alpha;
+ }
+ *(double*)dst[dst_bands-1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+premultiplied_to_non_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ double alpha;
+ int band;
+
+ alpha = *(double *)src[src_bands-1];
+ for (band=0; band<src_bands-1;band++)
+ {
+ if (alpha>0.001)
+ {
+ *(double*)dst[band] = *(double*) src[band] / alpha;
+ }
+ else
+ {
+ *(double*)dst[band] = 0.001;
+ }
+ }
+ *(double*)dst[dst_bands-1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+conversions (void)
+{
+ babl_conversion_new (
+ "babl-base: grayscale-gamma2.2 to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE_GAMMA_2_2),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_2_2_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale-gamma2.2",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE_GAMMA_2_2),
+ "planar", rgb_to_grayscale_2_2,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale to rgb",
+ "source", babl_model_id (BABL_GRAYSCALE),
+ "destination", babl_model_id (BABL_RGB),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha to rgb",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "destination", babl_model_id (BABL_RGB),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale-alpha",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgb to grayscale-alpha",
+ "source", babl_model_id (BABL_RGB),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgb to grayscale",
+ "source", babl_model_id (BABL_RGB),
+ "destination", babl_model_id (BABL_GRAYSCALE),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha to grayscale-alpha-premultiplied",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "planar", non_premultiplied_to_premultiplied,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha-premultuplied to grayscale-alpha",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "planar", premultiplied_to_non_premultiplied,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha-premultiplied to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_alpha_premultiplied_to_rgba,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale-alpha-premultiplied",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "planar", rgba_to_grayscale_alpha_premultiplied,
+ NULL
+ );
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+#include "util.h"
+#include "rgb-constants.h"
+#include "math.h"
+
+static void components (void);
+static void models (void);
+static void conversions (void);
+
+void babl_base_model_grayscale (void)
+{
+ components ();
+ models ();
+ conversions ();
+}
+
+static void
+components (void)
+{
+ babl_component_new (
+ "luminance",
+ "id", BABL_LUMINANCE,
+ "luma",
+ NULL);
+}
+
+static void
+models (void)
+{
+ babl_model_new (
+ "grayscale",
+ "id", BABL_GRAYSCALE,
+ babl_component_id (BABL_LUMINANCE),
+ NULL);
+
+ babl_model_new (
+ "grayscale-gamma2.2",
+ "id", BABL_GRAYSCALE_GAMMA_2_2,
+ babl_component_id (BABL_LUMINANCE),
+ NULL);
+
+ babl_model_new (
+ "grayscale-alpha",
+ "id", BABL_GRAYSCALE_ALPHA,
+ babl_component_id (BABL_LUMINANCE),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+ babl_model_new (
+ "grayscale-alpha-premultiplied",
+ "id", BABL_GRAYSCALE_ALPHA_PREMULTIPLIED,
+ babl_component_id (BABL_LUMINANCE_MUL_ALPHA),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+}
+
+
+static void
+rgb_to_grayscale (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double red, green, blue;
+ double luminance, alpha;
+
+ red = *(double *)src[0];
+ green = *(double *)src[1];
+ blue = *(double *)src[2];
+ if (src_bands>3)
+ alpha = *(double *)src[3];
+ else
+ alpha = 1.0;
+
+ luminance = red * RGB_LUMINANCE_RED +
+ green * RGB_LUMINANCE_GREEN +
+ blue * RGB_LUMINANCE_BLUE;
+ *(double*)dst[0] = luminance;
+
+ if (dst_bands==2)
+ *(double*)dst[1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+static void
+rgb_to_grayscale_2_2 (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double red, green, blue;
+ double luminance, alpha;
+
+ red = *(double *) src[0];
+ green = *(double *) src[1];
+ blue = *(double *) src[2];
+ if (src_bands>3)
+ alpha = *(double *)src[3];
+ else
+ alpha = 1.0;
+
+ luminance = red * RGB_LUMINANCE_RED +
+ green * RGB_LUMINANCE_GREEN +
+ blue * RGB_LUMINANCE_BLUE;
+ *(double*)dst[0] = pow (luminance, 2.2);
+
+ if (dst_bands==2)
+ *(double*)dst[1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+static void
+grayscale_2_2_to_rgb (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double luminance;
+ double red, green, blue;
+ double alpha;
+
+ luminance = pow (*(double *)src[0], (1.0F/2.2F));
+ red = luminance;
+ green = luminance;
+ blue = luminance;
+ if (src_bands > 1)
+ alpha = *(double *)src[1];
+ else
+ alpha = 1.0;
+
+ *(double*)dst[0] = red;
+ *(double*)dst[1] = green;
+ *(double*)dst[2] = blue;
+
+ if (dst_bands>3)
+ *(double*)dst[3] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+
+static void
+grayscale_to_rgb (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ double luminance;
+ double red, green, blue;
+ double alpha;
+
+ luminance = *(double *)src[0];
+ red = luminance;
+ green = luminance;
+ blue = luminance;
+ if (src_bands > 1)
+ alpha = *(double *)src[1];
+ else
+ alpha = 1.0;
+
+ *(double*)dst[0] = red;
+ *(double*)dst[1] = green;
+ *(double*)dst[2] = blue;
+
+ if (dst_bands>3)
+ *(double*)dst[3] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+grayscale_alpha_premultiplied_to_rgba (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ assert (src_bands == 2);
+ assert (dst_bands == 4);
+
+ while (n--)
+ {
+ double luminance = *(double *)src[0];
+ double alpha = *(double *)src[1];
+
+ if (alpha > 0.001)
+ {
+ luminance = luminance / alpha;
+ }
+ else
+ {
+ luminance = 0.0;
+ }
+
+ *(double*)dst[0] = luminance;
+ *(double*)dst[1] = luminance;
+ *(double*)dst[2] = luminance;
+ *(double*)dst[3] = alpha;
+ BABL_PLANAR_STEP
+ }
+}
+
+
+static void
+rgba_to_grayscale_alpha_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY;
+ assert (src_bands == 4);
+ assert (dst_bands == 2);
+
+ while (n--)
+ {
+ double red = *(double *)src[0];
+ double green = *(double *)src[1];
+ double blue = *(double *)src[2];
+ double alpha = *(double *)src[3];
+ double luminance;
+
+ luminance = red * RGB_LUMINANCE_RED +
+ green * RGB_LUMINANCE_GREEN +
+ blue * RGB_LUMINANCE_BLUE;
+
+ luminance *= alpha;
+
+ *(double*)dst[0] = luminance;
+ *(double*)dst[2] = alpha;
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+non_premultiplied_to_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ double alpha;
+ int band;
+
+ alpha = *(double *)src[src_bands-1];
+ for (band=0; band<src_bands-1;band++)
+ {
+ *(double*)dst[band] = *(double*) src[band] * alpha;
+ }
+ *(double*)dst[dst_bands-1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+premultiplied_to_non_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ double alpha;
+ int band;
+
+ alpha = *(double *)src[src_bands-1];
+ for (band=0; band<src_bands-1;band++)
+ {
+ if (alpha>0.001)
+ {
+ *(double*)dst[band] = *(double*) src[band] / alpha;
+ }
+ else
+ {
+ *(double*)dst[band] = 0.001;
+ }
+ }
+ *(double*)dst[dst_bands-1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+conversions (void)
+{
+ babl_conversion_new (
+ "babl-base: grayscale-gamma2.2 to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE_GAMMA_2_2),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_2_2_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale-gamma2.2",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE_GAMMA_2_2),
+ "planar", rgb_to_grayscale_2_2,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale to rgb",
+ "source", babl_model_id (BABL_GRAYSCALE),
+ "destination", babl_model_id (BABL_RGB),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha to rgb",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "destination", babl_model_id (BABL_RGB),
+ "planar", grayscale_to_rgb,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale-alpha",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgb to grayscale-alpha",
+ "source", babl_model_id (BABL_RGB),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgb to grayscale",
+ "source", babl_model_id (BABL_RGB),
+ "destination", babl_model_id (BABL_GRAYSCALE),
+ "planar", rgb_to_grayscale,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha to grayscale-alpha-premultiplied",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "planar", non_premultiplied_to_premultiplied,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha-premultuplied to grayscale-alpha",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA),
+ "planar", premultiplied_to_non_premultiplied,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: grayscale-alpha-premultiplied to rgba",
+ "source", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", grayscale_alpha_premultiplied_to_rgba,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to grayscale-alpha-premultiplied",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_GRAYSCALE_ALPHA_PREMULTIPLIED),
+ "planar", rgba_to_grayscale_alpha_premultiplied,
+ NULL
+ );
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <math.h>
+#include "babl.h"
+#include "util.h"
+
+static void models (void);
+static void components (void);
+static void conversions (void);
+static void pixel_formats (void);
+
+void
+babl_base_model_rgb (void)
+{
+ components ();
+ models ();
+ conversions ();
+ pixel_formats ();
+}
+
+static void
+components (void)
+{
+ babl_component_new (
+ "red",
+ "id", BABL_RED,
+ "luma",
+ "chroma",
+ NULL);
+
+ babl_component_new (
+ "green",
+ "id", BABL_GREEN,
+ "luma",
+ "chroma",
+ NULL);
+
+ babl_component_new (
+ "blue",
+ "id", BABL_BLUE,
+ "luma",
+ "chroma",
+ NULL);
+
+ babl_component_new (
+ "red-gamma2.2",
+ "id", BABL_RED_GAMMA_2_2,
+ "luma",
+ "chroma",
+ NULL);
+
+ babl_component_new (
+ "green-gamma2.2",
+ "id", BABL_GREEN_GAMMA_2_2,
+ "luma",
+ "chroma",
+ NULL);
+
+ babl_component_new (
+ "blue-gamma2.2",
+ "id", BABL_BLUE_GAMMA_2_2,
+ "luma",
+ "chroma",
+ NULL);
+
+
+ babl_component_new (
+ "alpha",
+ "id", BABL_ALPHA,
+ "alpha",
+ NULL);
+
+ babl_component_new (
+ "red*alpha",
+ "id", BABL_RED_MUL_ALPHA,
+ "luma",
+ "chroma",
+ "alpha",
+ NULL);
+ babl_component_new (
+ "green*alpha",
+ "id", BABL_GREEN_MUL_ALPHA,
+ "luma",
+ "chroma",
+ "alpha",
+ NULL);
+ babl_component_new (
+ "blue*alpha",
+ "id", BABL_BLUE_MUL_ALPHA,
+ "luma",
+ "chroma",
+ "alpha",
+ NULL);
+
+ babl_component_new (
+ "luminance*alpha",
+ "id", BABL_LUMINANCE_MUL_ALPHA,
+ "luma",
+ NULL);
+}
+
+static void
+models (void)
+{
+ babl_model_new (
+ "rgba",
+ "id", BABL_RGBA,
+ babl_component_id (BABL_RED),
+ babl_component_id (BABL_GREEN),
+ babl_component_id (BABL_BLUE),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+ babl_model_new (
+ "rgb",
+ "id", BABL_RGB,
+ babl_component_id (BABL_RED),
+ babl_component_id (BABL_GREEN),
+ babl_component_id (BABL_BLUE),
+ NULL);
+
+ babl_model_new (
+ "rgbA",
+ "id", BABL_RGBA_PREMULTIPLIED,
+ babl_component_id (BABL_RED_MUL_ALPHA),
+ babl_component_id (BABL_GREEN_MUL_ALPHA),
+ babl_component_id (BABL_BLUE_MUL_ALPHA),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+ babl_model_new (
+ "rgb-gamma2.2",
+ "id", BABL_RGB_GAMMA_2_2,
+ babl_component_id (BABL_RED_GAMMA_2_2),
+ babl_component_id (BABL_GREEN_GAMMA_2_2),
+ babl_component_id (BABL_BLUE_GAMMA_2_2),
+ NULL);
+
+ babl_model_new (
+ "rgba-gamma2.2",
+ "id", BABL_RGBA_GAMMA_2_2,
+ babl_component_id (BABL_RED_GAMMA_2_2),
+ babl_component_id (BABL_GREEN_GAMMA_2_2),
+ babl_component_id (BABL_BLUE_GAMMA_2_2),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+}
+
+static void
+copy_strip_1 (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+ while (n--)
+ {
+ int i;
+
+ for (i=0;i<dst_bands;i++)
+ {
+ double foo;
+ if (i<src_bands)
+ foo = *(double *) src[i];
+ else
+ foo = 1.0;
+ *(double*)dst[i] = foo;
+ }
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+g3_gamma_2_2 (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ int band;
+ for (band=0;band<3;band++)
+ *(double*)dst[band] = pow (*(double*) src[band], 2.2);
+ for (;band<dst_bands;band++)
+ *(double*)dst[band] = *(double*) src[band];
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+static void
+g3_inv_gamma_2_2 (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ int band;
+ for (band=0;band<3;band++)
+ {
+ *(double*)dst[band] = pow (*(double*) src[band], (1.0F/2.2F));
+ }
+ for (;band<dst_bands;band++)
+ {
+ *(double*)dst[band] = *(double*) src[band];
+ }
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+non_premultiplied_to_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ double alpha;
+ int band;
+
+ alpha = *(double *)src[src_bands-1];
+ for (band=0; band<src_bands-1;band++)
+ {
+ *(double*)dst[band] = *(double*) src[band] * alpha;
+ }
+ *(double*)dst[dst_bands-1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+static void
+premultiplied_to_non_premultiplied (int src_bands,
+ void **src,
+ int *src_pitch,
+ int dst_bands,
+ void **dst,
+ int *dst_pitch,
+ int n)
+{
+ BABL_PLANAR_SANITY
+
+ while (n--)
+ {
+ double alpha;
+ int band;
+
+ alpha = *(double *)src[src_bands-1];
+ for (band=0; band<src_bands-1;band++)
+ {
+ if (alpha>0.001)
+ {
+ *(double*)dst[band] = *(double*) src[band] / alpha;
+ }
+ else
+ {
+ *(double*)dst[band] = 0.001;
+ }
+ }
+ *(double*)dst[dst_bands-1] = alpha;
+
+ BABL_PLANAR_STEP
+ }
+}
+
+
+
+
+static void
+conversions (void)
+{
+ babl_conversion_new (
+ "babl-base: rgba to rgba",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", copy_strip_1,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to rgb-gamma2.2",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_RGB_GAMMA_2_2),
+ "planar", g3_gamma_2_2,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to rgba-gamma2.2",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_RGBA_GAMMA_2_2),
+ "planar", g3_gamma_2_2,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgb-gamma2.2 to rgba",
+ "source", babl_model_id (BABL_RGB_GAMMA_2_2),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", g3_inv_gamma_2_2,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba-gamma2.2 to rgba",
+ "source", babl_model_id (BABL_RGBA_GAMMA_2_2),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", g3_inv_gamma_2_2,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgb to rgba",
+ "source", babl_model_id (BABL_RGB),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", copy_strip_1,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to rgb",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_RGB),
+ "planar", copy_strip_1,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgba to rgbA",
+ "source", babl_model_id (BABL_RGBA),
+ "destination", babl_model_id (BABL_RGBA_PREMULTIPLIED),
+ "planar", non_premultiplied_to_premultiplied,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: rgbA to rgba",
+ "source", babl_model_id (BABL_RGBA_PREMULTIPLIED),
+ "destination", babl_model_id (BABL_RGBA),
+ "planar", premultiplied_to_non_premultiplied,
+ NULL
+ );
+}
+
+static void
+pixel_formats (void)
+{
+ babl_pixel_format_new (
+ "srgb",
+ "id", BABL_SRGB,
+ babl_model_id (BABL_RGB_GAMMA_2_2),
+ babl_type_id (BABL_U8),
+ babl_component_id (BABL_RED_GAMMA_2_2),
+ babl_component_id (BABL_GREEN_GAMMA_2_2),
+ babl_component_id (BABL_BLUE_GAMMA_2_2),
+ NULL);
+
+ babl_pixel_format_new (
+ "srgba",
+ "id", BABL_SRGBA,
+ babl_model_id (BABL_RGBA_GAMMA_2_2),
+ babl_type_id (BABL_U8),
+ babl_component_id (BABL_RED_GAMMA_2_2),
+ babl_component_id (BABL_GREEN_GAMMA_2_2),
+ babl_component_id (BABL_BLUE_GAMMA_2_2),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+ babl_pixel_format_new (
+ "rgba-float",
+ "id", BABL_RGBA_FLOAT,
+ babl_model_id (BABL_RGBA),
+ babl_type_id (BABL_FLOAT),
+ babl_component_id (BABL_RED),
+ babl_component_id (BABL_GREEN),
+ babl_component_id (BABL_BLUE),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+ babl_pixel_format_new (
+ "rgba-double",
+ "id", BABL_RGBA_DOUBLE,
+ babl_model_id (BABL_RGBA),
+ babl_type_id (BABL_FLOAT),
+ babl_component_id (BABL_RED),
+ babl_component_id (BABL_GREEN),
+ babl_component_id (BABL_BLUE),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+ babl_pixel_format_new (
+ "rgb-float",
+ "id", BABL_RGB_FLOAT,
+ babl_model_id (BABL_RGB),
+ babl_type_id (BABL_FLOAT),
+ babl_component_id (BABL_RED),
+ babl_component_id (BABL_GREEN),
+ babl_component_id (BABL_BLUE),
+ NULL);
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+
+void babl_base_pixel_formats (void)
+{
+
+
+ babl_pixel_format_new (
+ "cmyk-float",
+ "id", BABL_CMYK_FLOAT,
+ babl_model_id (BABL_CMYK),
+ babl_type_id (BABL_FLOAT),
+ babl_component_id (BABL_CYAN),
+ babl_component_id (BABL_MAGENTA),
+ babl_component_id (BABL_YELLOW),
+ babl_component_id (BABL_KEY),
+ NULL);
+
+ babl_pixel_format_new (
+ "cmyka-float",
+ "id", BABL_CMYKA_FLOAT,
+ babl_model_id (BABL_CMYKA),
+ babl_type_id (BABL_FLOAT),
+ babl_component_id (BABL_CYAN),
+ babl_component_id (BABL_MAGENTA),
+ babl_component_id (BABL_YELLOW),
+ babl_component_id (BABL_KEY),
+ babl_component_id (BABL_ALPHA),
+ NULL);
+
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define RGB_LUMINANCE_RED (0.2126)
+#define RGB_LUMINANCE_GREEN (0.7152)
+#define RGB_LUMINANCE_BLUE (0.0722)
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <assert.h>
+
+#include "babl.h"
+
+static void
+convert_double_double (void *src,
+ void *dst,
+ int n)
+{
+ memcpy (dst, src, n/8);
+}
+
+void
+babl_base_type_double (void)
+{
+ babl_type_new (
+ "double",
+ "id", BABL_DOUBLE,
+ "bits", 64,
+ NULL);
+
+ babl_conversion_new (
+ "babl-base: double to double",
+ "source", babl_type_id (BABL_DOUBLE),
+ "destination", babl_type_id (BABL_DOUBLE),
+ "linear", convert_double_double,
+ NULL
+ );
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <assert.h>
+
+#include "babl.h"
+
+static void
+convert_double_float (void *src,
+ void *dst,
+ int n)
+{
+ while (n--)
+ {
+ (*(float *) dst) = (*(double *) src);
+ dst += 4;
+ src += 8;
+ }
+}
+
+static void
+convert_float_double (void *src,
+ void *dst,
+ int n)
+{
+ while (n--)
+ {
+ (*(double *) dst) = (*(float *) src);
+ dst += 8;
+ src += 4;
+ }
+}
+
+void
+babl_base_type_float (void)
+{
+ babl_type_new (
+ "float",
+ "id", BABL_FLOAT,
+ "bits", 32,
+ NULL);
+
+ babl_conversion_new (
+ "babl-base: float to double",
+ "source", babl_type_id (BABL_FLOAT),
+ "destination", babl_type_id (BABL_DOUBLE),
+ "linear", convert_float_double,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: double to float",
+ "source", babl_type_id (BABL_DOUBLE),
+ "destination", babl_type_id (BABL_FLOAT),
+ "linear", convert_double_float,
+ NULL
+ );
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <assert.h>
+
+#include "babl.h"
+
+static void
+convert_double_u16 (void *src,
+ void *dst,
+ int n)
+{
+ while (n--)
+ {
+ double dval = *(double *) src;
+ unsigned short u16val;
+
+ if (dval < 0)
+ u16val = 0;
+ else if (dval > 1)
+ u16val = 65535;
+ else
+ u16val = dval*65535.0;
+ *(unsigned short *) dst = u16val;
+ dst += 2;
+ src += 8;
+ }
+}
+
+static void
+convert_u16_double (void *src,
+ void *dst,
+ int n)
+{
+ while (n--)
+ {
+ (*(double *) dst) = (*(unsigned short *) src*65535.0);
+ dst += 8;
+ src += 2;
+ }
+}
+
+void
+babl_base_type_u16 (void)
+{
+ babl_type_new (
+ "u16",
+ "id", BABL_U16,
+ "bits", 16,
+ NULL);
+
+ babl_conversion_new (
+ "babl-base: u16 to double",
+ "source", babl_type_id (BABL_U16),
+ "destination", babl_type_id (BABL_DOUBLE),
+ "linear", convert_u16_double,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: double to u16",
+ "source", babl_type_id (BABL_DOUBLE),
+ "destination", babl_type_id (BABL_U16),
+ "linear", convert_double_u16,
+ NULL
+ );
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <assert.h>
+
+#include "babl.h"
+
+static void
+convert_u8_double (void *src,
+ void *dst,
+ int n)
+{
+ while (n--)
+ {
+ (*(double *) dst) = (*(unsigned char *) src/255.0);
+ dst += 8;
+ src += 1;
+ }
+}
+
+static void
+convert_double_u8 (void *src,
+ void *dst,
+ int n)
+{
+ while (n--)
+ {
+ double dval = *(double *) src;
+ unsigned char u8val;
+
+ if (dval < 0)
+ u8val = 0;
+ else if (dval > 1)
+ u8val = 255;
+ else
+ u8val = dval*255.0;
+
+ *(unsigned char *) dst = u8val;
+ dst += 1;
+ src += 8;
+ }
+}
+
+void
+babl_base_type_u8 (void)
+{
+ babl_type_new (
+ "u8",
+ "id", BABL_U8,
+ "bits", 8,
+ NULL);
+
+ babl_conversion_new (
+ "babl-base: u8 to double",
+ "source", babl_type_id (BABL_U8),
+ "destination", babl_type_id (BABL_DOUBLE),
+ "linear", convert_u8_double,
+ NULL
+ );
+
+ babl_conversion_new (
+ "babl-base: double to u8",
+ "source", babl_type_id (BABL_DOUBLE),
+ "destination", babl_type_id (BABL_U8),
+ "linear", convert_double_u8,
+ NULL
+ );
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <assert.h>
+
+#include "babl.h"
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _UTIL_H
+#define _UTIL_H
+
+#include <assert.h>
+
+#define BABL_PLANAR_SANITY \
+ { \
+ assert(src_bands>0); \
+ assert(dst_bands>0); \
+ assert(src); \
+ assert(*src); \
+ assert(dst); \
+ assert(*dst); \
+ assert(n>0); \
+ assert(*src_pitch); \
+ }
+
+#define BABL_PLANAR_STEP \
+ { \
+ int i; \
+ for (i=0; i< src_bands; i++) \
+ src[i]+=src_pitch[i]; \
+ for (i=0; i< dst_bands; i++) \
+ dst[i]+=dst_pitch[i]; \
+ }
+
+#endif
AC_OUTPUT(Makefile \
babl.pc \
babl/Makefile \
- babl/babl-base/Makefile \
+ babl/base/Makefile \
tests/Makefile \
INSTALL \
README